﻿using System;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Recomendaciones.Entidades;
using Recomendaciones.AccesoADatos;

/// <summary>
/// Descripción breve de UsuarioServices
/// </summary>
public class UsuarioServices
{
    Ado _ado;

    #region Constructor y Destructor
    public UsuarioServices()
    {
        _ado = new Ado();
    }

    ~UsuarioServices()
    {
        _ado = null;
    }
    #endregion

    public Usuario VerificarUsuario(string nombre, string password)
    {
        try
        {
            ArrayList parametros = new ArrayList(2);
            parametros.Add(nombre);
            parametros.Add(password);
            _ado.EjecutarStoredProcedureDataReader("Usuario_Verificar", parametros);
            DataTable usuario = _ado.DevolverDatosRapido();

            if (usuario.Rows.Count > 0)
                return ((List<Usuario>)CollectionHelper.ConvertTo<Usuario>(usuario))[0];
            else
                return null;
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public Usuario ObtenerUsuario(int usuarioId)
    {
        try
        {
            ArrayList parametros = new ArrayList(1);
            parametros.Add(usuarioId);
            _ado.EjecutarStoredProcedureDataReader("Usuario_ObtenerPorId", parametros);
            DataTable usuario = _ado.DevolverDatosRapido();

            if (usuario.Rows.Count > 0)
                return ((List<Usuario>)CollectionHelper.ConvertTo<Usuario>(usuario))[0];
            else
                return null;
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string RegistrarUsuario(string usuario, string password, string email)
    {
        try
        {
            if (String.IsNullOrEmpty(password) || password.Length < 8 || password.Length > 15 || !tieneTresNumeros(password) || !tieneUnaMayuscula(password) || !esAlfanumerico(password))
                return "Password invalido";
            if (String.IsNullOrEmpty(usuario) || usuario.Length < 8 || usuario.Length > 30 || !esAlfanumerico(usuario))
                return "Usuario invalido";
            if (String.IsNullOrEmpty(email) || email.Length > 35 || !esEmail(email))
                return "Email invalido";

            ArrayList parametros = new ArrayList(3);
            parametros.Add(usuario);
            parametros.Add(password);
            parametros.Add(email);
            _ado.EjecutarStoredProcedureDataReader("Usuario_Registrar", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string ActualizarUsuario(string usuarioId, string nombre, string apellido, string fechaNacimiento, string sexo, string email)
    {
        try
        {
            if (nombre.Length > 30 || !esAlfanumericoTildes(nombre))
                return "Nombre invalido";
            if (apellido.Length > 30 || !esAlfanumericoTildes(apellido))
                return "Apellido invalido";
            if (!esFecha(fechaNacimiento))
                return "Fecha de nacimiento invalida";
            if (String.IsNullOrEmpty(sexo) || !esSexo(sexo))
                return "Sexo invalido";
            if (String.IsNullOrEmpty(email) || email.Length > 35 || !esEmail(email))
                return "Email invalido";

            ArrayList parametros = new ArrayList(6);
            parametros.Add(Convert.ToInt32(usuarioId));
            parametros.Add(nombre);
            parametros.Add(apellido);
            parametros.Add(Convert.ToDateTime(fechaNacimiento));
            parametros.Add(sexo);
            parametros.Add(email);
            _ado.EjecutarStoredProcedureDataReader("Usuario_Actualizar", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string BajaUsuario(int usuarioId)
    {
        try
        {
            ArrayList parametros = new ArrayList(1);
            parametros.Add(usuarioId);
            _ado.EjecutarStoredProcedureDataReader("Usuario_Baja", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    #region Validaciones

    private bool tieneTresNumeros(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("[0-9]{3}");
        return regExobj.IsMatch(cadena);
    }

    private bool tieneUnaMayuscula(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("[A-Z]{1}");
        return regExobj.IsMatch(cadena);
    }

    private bool esAlfanumerico(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[\\w]*$");
        return regExobj.IsMatch(cadena);
    }

    private bool esAlfanumericoTildes(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[\\w áéíóúÁÉÍÓÚ]*$");
        return regExobj.IsMatch(cadena);
    }

    private bool esEmail(string cadena)
    {
        try
        {
            System.Net.Mail.MailAddress m = new System.Net.Mail.MailAddress(cadena);
            return true;
        }
        catch (FormatException)
        {
            return false;
        }

    }

    private bool esFecha(string cadena)
    {
        DateTime dt;

        bool valido = DateTime.TryParseExact(cadena, "yyyy/mm/dd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt);

        return valido;

    }

    private bool esSexo(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^Masculino|Femenino$");
        return regExobj.IsMatch(cadena);
    }

    #endregion

}
